package com.layblog.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.layblog.entity.UserMessage;
import com.layblog.service.UserMessageService;
import com.layblog.service.WsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * @Author 林必昭
 * @Date 2021/9/6 12:59
 */

@Slf4j
@Service
public class WsServiceImpl implements WsService {

    @Autowired
    private UserMessageService userMessageService;

    @Autowired
    private SimpMessagingTemplate messagingTemplate;


    /**
     * 订阅连接为/user/{userId}/messCount的用户能收到消息
     * /user/为默认前缀
     * <p>
     * 发送消息的实现不难，如若传的count不为空的时候，我们就返回count的数量，
     * 当count为空的时候，我们就搜索userId所有未读的消息数量，然后返回给前端，
     * 把ws发送消息的方法改成了异步方法，会起一个新的线程执行发送
     *
     * @param userId 参数userId，表明要给谁传消息
     * @param count  返回的数量
     */
    @Async
    @Override
    public void sendMessCountToUser(Long userId, Integer count) {
        if (count == null) {
            count = userMessageService.count(new QueryWrapper<UserMessage>()
                    .eq("status", 0)
                    .eq("to_user_id", userId));
        }
        /*
            发送ws消息，用的是SimpMessagingTemplate，convertAndSendToUser方法会自动在前面添加前缀/user，
            然后是userId，加上后面的后缀/messCount，所以加起来的链接其实就是/user/{userId}/messCount，那
            么我们在需要发送消息的地方调用这个方法即可。
         */
        this.messagingTemplate.convertAndSendToUser(userId.toString(), "/messCount", count);
        log.info("ws发送消息成功------------->用户id {},数量：{}", userId, count);
    }
}
